<template>
  <h2>Hello</h2>
</template>

<script setup>
    import * as THREE from 'three';
    // import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
    // 引入轨道控制器扩展库OrbitControls.js
    import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

    // 1. 场景 -> （几何体 + 材质）=> 网格模型对象
    // 创建3D场景对象Scene
    const scene = new THREE.Scene();
    //创建一个长方体几何对象Geometry
    const geometry = new THREE.BoxGeometry(100, 100, 100); 
    //创建一个材质对象Material
    // const material = new THREE.MeshBasicMaterial({
    //     color: 0xffaaff,//0xff0000设置材质颜色为红色
    //     transparent:true,//开启透明
    //     opacity:0.5,//设置透明度
    // })
    // 漫反射材质
    const material = new THREE.MeshLambertMaterial({
        color: 0xffaaff,//0xff0000设置材质颜色为红色
        transparent:true,//开启透明
        opacity: 0.5,//设置透明度
    })
    
    // 两个参数分别为几何体geometry、材质material
    const mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
    //设置网格模型在三维空间中的位置坐标，默认是坐标原点
    mesh.position.set(0,0,0);
    scene.add(mesh); 

    // 2. 相机
    // 定义相机输出画布的尺寸(单位:像素px)
    const width = 800; //宽度
    const height = 500; //高度
    // 30:视场角度, width / height:Canvas画布宽高比, 1:近裁截面, 3000：远裁截面
    const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
    //相机在Three.js三维坐标系中的位置
    // 根据需要设置相机位置具体值
    camera.position.set(200, 200, 200); 
    //相机观察目标指向Threejs 3D空间中某个位置
    // camera.lookAt(0, 0, 0); //坐标原点
    camera.lookAt(mesh.position);//指向mesh对应的位置

    // 辅助内容****start
    // 1. 坐标系   AxesHelper：辅助观察的坐标系
    const axesHelper = new THREE.AxesHelper(150);
    scene.add(axesHelper);

    // 2. 光源
    // 2.1 点光源
    const pointLight = new THREE.PointLight(0xffffff, 3) // 点光源
    // pointLight.intensity = 1.0 // 光照强度
    pointLight.decay = 0.0;//设置光源不随距离衰减
    //点光源位置
    pointLight.position.set(150, 150, 150);//点光源放在x轴上
    // pointLight.position.set(400, 200, 300); 
    scene.add(pointLight); //点光源添加到场景中
    // 光源辅助观察
    const pointLightHelper = new THREE.PointLightHelper(pointLight, 10);
    scene.add(pointLightHelper);

    // // 2.2 环境光:没有特定方向，整体改变场景的光照明暗
    // const ambient = new THREE.AmbientLight(0xffffff, 0.4);
    // ambient.position.set(0, 200, 0)
    // scene.add(ambient);
    // // 光源辅助观察
    // const ambientHelper = new THREE.PointLightHelper(ambient, 10);
    // scene.add(ambientHelper);

    // 2.3 平行光
    // const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
    // // 设置光源的方向：通过光源position属性和目标指向对象的position属性计算
    // directionalLight.position.set(150, 0, 0);
    // // 方向光指向对象网格模型mesh，可以不设置，默认的位置是0,0,0
    // directionalLight.target = mesh;
    // scene.add(directionalLight);
    // // 光源辅助观察
    // const directionalLightHelper = new THREE.PointLightHelper(directionalLight, 5, 0xff0000);
    // scene.add(directionalLightHelper);

    // 创建渲染器对象
    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(width, height); //设置three.js渲染区域的尺寸(像素px)
    // 3. 设置相机控件轨道控制器
    const controls = new OrbitControls(camera, renderer.domElement);
    // 如果OrbitControls改变了相机参数，重新调用渲染器渲染三维场景
    controls.addEventListener('change', function () {
      console.log('camera.position',camera.position);
      renderer.render(scene, camera); //执行渲染操作
    });//监听鼠标、键盘事件
    // *************end

    // 3.渲染
    
    renderer.render(scene, camera); //执行渲染操作
    document.body.appendChild(renderer.domElement);

    // 动画：渲染函数
    // function render() {
    //     renderer.render(scene, camera); //执行渲染操作
    //     mesh.rotateY(0.01);//每次绕y轴旋转0.01弧度
    //     window.requestAnimationFrame(render);//请求再次执行渲染函数render，渲染下一帧
    // }
    // render();

</script>

<style>
</style>
